package org.wdcode.common.params;

import org.wdcode.common.constants.DateConstants;
import org.wdcode.common.constants.EncryptConstants;

/**
 * WdWeb包参数读取类
 * @author WD
 * @since JDK6
 * @version 1.0 2010-01-05
 */
public final class WdCommonParams extends WdParams {
	/* 读取配置变量 */
	/* DateUtil 使用 */
	private static String		dateFormat;			// DateUtil的日期默认格式

	/* IO */
	private static int			ioBufferSize;			// IO缓冲区大小

	/* 加密使用 */
	private static String		encryptKey;			// 加密使用的密钥
	private static String		encryptAlgo;			// 加密算法
	private static String		encryptDigest;			// 摘要算法
	private static int			encryptKeyLengthAES;	// AES密钥长度
	private static int			encryptKeyLengthDES;	// DES密钥长度
	private static int			encryptKeyLengthRC2;	// AES密钥长度
	private static int			encryptKeyLengthRC4;	// DES密钥长度

	/* 读取配置字符串 */
	/* DateUtil使用 */
	private final static String	DATE_FORMAT;			// DateUtil的日期默认格式

	/* IO */
	private final static String	IO_BUFFERSIZE;			// IO缓冲区大小

	/* 加密使用 */
	private final static String	ENCRYPT_KEY;			// 加密使用的密钥
	private final static String	ENCRYPT_ALGO;			// 加密算法
	private final static String	ENCRYPT_DIGEST;		// 摘要算法
	private final static String	ENCRYPT_KEY_LENGTH_AES; // AES密钥长度
	private final static String	ENCRYPT_KEY_LENGTH_DES; // DES密钥长度
	private final static String	ENCRYPT_KEY_LENGTH_RC2; // AES密钥长度
	private final static String	ENCRYPT_KEY_LENGTH_RC4; // DES密钥长度

	// 静态初始化
	static {
		dateFormat = DateConstants.FORMAT_Y_M_D_H_M_S; // DateUtil的日期默认格式

		/* IO */
		ioBufferSize = 8192; // IO缓冲区大小

		/* 加密使用 */
		encryptKey = "http://www.wdcode.org"; // 加密使用的密钥
		encryptAlgo = EncryptConstants.ALGO_AES; // 加密算法
		encryptDigest = EncryptConstants.ALGO_SHA_1; // 摘要算法
		encryptKeyLengthAES = 128; // AES密钥长度
		encryptKeyLengthDES = 64; // DES密钥长度
		encryptKeyLengthRC2 = 128; // RC2密钥长度
		encryptKeyLengthRC4 = 128; // RC4密钥长度

		/* 读取配置字符串 */
		/* DateUtil使用 */
		DATE_FORMAT = "date.format"; // DateUtil的日期默认格式

		/* IO */
		IO_BUFFERSIZE = "io.bufferSize"; // IO缓冲区大小

		/* 加密使用 */
		ENCRYPT_KEY = "encrypt.key"; // 加密使用的密钥
		ENCRYPT_ALGO = "encrypt.algo"; // 加密算法
		ENCRYPT_DIGEST = "encrypt.digest"; // 摘要算法
		ENCRYPT_KEY_LENGTH_AES = "encrypt.key.length.AES"; // AES密钥长度
		ENCRYPT_KEY_LENGTH_DES = "encrypt.key.length.DES"; // DES密钥长度
		ENCRYPT_KEY_LENGTH_RC2 = "encrypt.key.length.RC2"; // AES密钥长度
		ENCRYPT_KEY_LENGTH_RC4 = "encrypt.key.length.RC4"; // DES密钥长度

		read();
	}

	/**
	 * 读取参数配置
	 */
	public final static void read() {
		/* 获得 DateUtil 配置 */
		dateFormat = getString(DATE_FORMAT, dateFormat);

		/* 获得 IO 配置 */
		ioBufferSize = getInt(IO_BUFFERSIZE, ioBufferSize);

		/* 加密使用 */
		encryptKey = getString(ENCRYPT_KEY, encryptKey);
		encryptAlgo = getString(ENCRYPT_ALGO, encryptAlgo);
		encryptDigest = getString(ENCRYPT_DIGEST, encryptDigest);
		encryptKeyLengthAES = getInt(ENCRYPT_KEY_LENGTH_AES, encryptKeyLengthAES);
		encryptKeyLengthDES = getInt(ENCRYPT_KEY_LENGTH_DES, encryptKeyLengthDES);
		encryptKeyLengthRC2 = getInt(ENCRYPT_KEY_LENGTH_RC2, encryptKeyLengthRC2);
		encryptKeyLengthRC4 = getInt(ENCRYPT_KEY_LENGTH_RC4, encryptKeyLengthRC4);
	}

	/**
	 * DES加密使用的密钥的长度(位)<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先64位密钥<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: encrypt.key.length.DES = ? <br/>
	 * XML: {@literal
	 * <encrypt><key><length><DES>?</DES></length></key></encrypt>}</h2>
	 * @see org.wdcode.common.tools.Encrypt
	 * @return DES加密使用的密钥的长度(位)
	 */
	public final static int getEncryptKeyLengthDES() {
		return encryptKeyLengthDES;
	}

	/**
	 * AES加密使用的密钥的长度(位)<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先128位密钥<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: encrypt.key.length.AES = ? <br/>
	 * XML: {@literal
	 * <encrypt><key><length><AES>?</AES></length></key></encrypt>}</h2>
	 * @see org.wdcode.common.tools.Encrypt
	 * @return AES加密使用的密钥的长度(位)
	 */
	public final static int getEncryptKeyLengthAES() {
		return encryptKeyLengthAES;
	}

	/**
	 * RC2加密使用的密钥的长度(位)<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先128位密钥<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: encrypt.key.length.RC2 = ? <br/>
	 * XML: {@literal
	 * <encrypt><key><length><RC2>?</RC2></length></key></encrypt>}</h2>
	 * @see org.wdcode.common.tools.Encrypt
	 * @return RC2加密使用的密钥的长度(位)
	 */
	public final static int getEncryptKeyLengthRC2() {
		return encryptKeyLengthRC2;
	}

	/**
	 * RC4加密使用的密钥的长度(位)<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先128位密钥<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: encrypt.key.length.RC4 = ? <br/>
	 * XML: {@literal
	 * <encrypt><key><length><RC4>?</RC4></length></key></encrypt>}</h2>
	 * @see org.wdcode.common.tools.Encrypt
	 * @return RC4加密使用的密钥的长度(位)
	 */
	public final static int getEncryptKeyLengthRC4() {
		return encryptKeyLengthRC4;
	}

	/**
	 * 加密使用的密钥 Encrypt使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用默认密钥<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: encrypt.key = ? <br/>
	 * XML: {@literal <encrypt><key>?</key></encrypt>}</h2>
	 * @see org.wdcode.common.tools.Encrypt
	 * @return 加密使用的密钥
	 */
	public final static String getEncryptKey() {
		return encryptKey;
	}

	/**
	 * 加密使用的算法 Encrypt使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用AES<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: encrypt.algo = ? <br/>
	 * XML: {@literal <encrypt><algo>?</algo></encrypt>}</h2>
	 * @see org.wdcode.common.tools.Encrypt
	 * @return 加密使用的算法
	 */
	public final static String getEncryptAlgo() {
		return encryptAlgo;
	}

	/**
	 * 加密使用摘要算法 Encrypt使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用MD5<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: encrypt.digest = ? <br/>
	 * XML: {@literal <encrypt><digest>?</digest></encrypt>}</h2>
	 * @see org.wdcode.common.tools.Encrypt
	 * @return 加密使用摘要算法
	 */
	public final static String getEncryptDigest() {
		return encryptDigest;
	}

	/**
	 * 获得IO使用的缓冲区大小,本包内的所有IO操作的缓冲区都使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用8192<br/>
	 * <h2>注: 取值是大于0的正整数 配置方式如下: <br/>
	 * Properties: io.bufferSize = ? <br/>
	 * XML: {@literal <io><bufferSize>?</bufferSize></io>}</h2>
	 * @see org.wdcode.common.io.StreamUtil
	 * @see org.wdcode.common.nio.StreamChannel
	 * @return IO使用的缓冲区大小
	 */
	public final static int getIoBufferSize() {
		return ioBufferSize;
	}

	/**
	 * 设置IO使用的缓冲区大小
	 * @param size IO使用的缓冲区大小
	 */
	public final static void setIoBufferSize(int size) {
		ioBufferSize = size;
		setProperty(IO_BUFFERSIZE, ioBufferSize);
	}

	/**
	 * 获得默认日期格式,org.wdcode.common.util.DateUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用yyyy-MM-dd HH:mm:ss<br/>
	 * <h2>注: 取值是 yyyy-MM-dd HH:mm:ss,yyyy-MM-dd 等日期格式 配置方式如下: <br/>
	 * Properties: date.format = ? <br/>
	 * XML: {@literal <date><format>?</format></date>}</h2>
	 * @see org.wdcode.common.util.DateUtil
	 * @return 日期格式
	 */
	public final static String getDateFormat() {
		return dateFormat;
	}

	/**
	 * 设置日期格式
	 * @param format 日期格式
	 */
	public final static void setDateFormat(String format) {
		dateFormat = format;
		setProperty(DATE_FORMAT, dateFormat);
	}

	/**
	 * 私有构造
	 */
	private WdCommonParams() {}
}
